#include "include.h"

Particle particles[1024 * 16]; // 懒得去malloc了 反正半中间还有新加粒子
GtkWidget *drawing_area;	   // 绘图区域指针
float xa_g = 0;				   // 环境重力
float ya_g = 0;				   // 环境重力
int par_num = PAR_NUM;		   // 粒子数量

pthread_mutex_t th_mutex[TH_MAX]; // 计算加速度线程 同步 互斥锁
pthread_cond_t th_cond[TH_MAX];	  // 计算加速度线程 同步 信号
volatile int th_flag[TH_MAX];	  // 计算加速度线程 同步 标志

pthread_mutex_t mutex0 = PTHREAD_MUTEX_INITIALIZER; // 计算速度位置线程 同步 互斥锁
pthread_cond_t cond0 = PTHREAD_COND_INITIALIZER;	// 计算速度位置线程 同步 信号
volatile int flag0 = 0;								// 计算速度位置线程 同步 标志
volatile unsigned int run_cnt0 = 0;					// 计算速度位置线程 计数

int th_num = TH_NUM;

long new_time, old_time = 0;
gboolean update_fps(gpointer data)
{
	struct timeval currentTime;
	float time_dx;
	float accurate_fps;

	gettimeofday(&currentTime, NULL);								   // 获取当前时间
	new_time = currentTime.tv_sec * 1000 + currentTime.tv_usec / 1000; // 计算毫秒
	if (old_time == 0)												   // 如果时第一次运行
	{
		old_time = new_time - 1000;
	}
	time_dx = (float)(new_time - old_time) / 1000; // 计算两次之间的时间

	accurate_fps = run_cnt0 / time_dx;
	printf("fps:%03.1f\n", accurate_fps);
	run_cnt0 = 0;
	old_time = new_time;

	return G_SOURCE_CONTINUE;
}

int main(int argc, char *argv[])
{
	if (argc >= 2)
	{
		th_num = atoi(argv[1]); // 从命令行参数中获取线程数量
	}
	printf("th_num:%d\n", th_num);

	par_num -= par_num % th_num; // 根据线程数量调整参数数量

	par_init();				 // 初始化参数
	gtk_ui_init(argc, argv); // 主UI初始化
	thread_init();			 // 多线程初始化
	gtk_main();				 // 进入GTK主循环
	return 0;
}
